package com.rayc.mall.item.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rayc.mall.api.dto.ItemDTO;
import com.rayc.mall.api.dto.ItemFormDTO;
import com.rayc.mall.api.dto.OrderItemDTO;
import com.rayc.mall.common.enums.ItemADFlag;
import com.rayc.mall.common.enums.ItemStatus;
import com.rayc.mall.common.exception.BizIllegalException;
import com.rayc.mall.common.result.PageDTO;
import com.rayc.mall.common.utils.BeanUtils;
import com.rayc.mall.item.domain.po.Item;
import com.rayc.mall.item.domain.po.ItemDoc;
import com.rayc.mall.item.domain.query.ItemPageQuery;
import com.rayc.mall.item.domain.vo.ItemVO;
import com.rayc.mall.item.mapper.ItemMapper;
import com.rayc.mall.item.service.IItemService;
import com.rayc.mall.item.utils.ESUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;

/**
 * @Author: Ray-C
 * @CreateTime: 2025-03-23
 * @Description: 商品service实现
 * @Version: 1.0
 */
@Service
public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements IItemService {
    @Resource
    @Lazy
    private ESUtils esUtils;
    @Resource
    private ItemMapper itemMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateStockAndSold(List<OrderItemDTO> items) {
        try {
            items.forEach(itemMapper::updateStockAndSold);
            // mysql正常结束之后再执行es的
            items.forEach(orderItemDTO -> {
                Long itemId = orderItemDTO.getItemId();
                Item item = itemMapper.selectById(itemId);
                // 同步es
                esUtils.save(ItemDoc.fromItem(item));
            });
        } catch (Exception e) {
            throw new BizIllegalException("更新库存异常，可能是库存不足!", e);
        }
    }

    @Override
    public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
        return BeanUtils.copyList(listByIds(ids), ItemDTO.class);
    }

//    @Override
//    public Page<Item> search(ItemPageQuery query) {
//        return lambdaQuery()
//                .like(StrUtil.isNotBlank(query.getKey()), Item::getName, query.getKey())
//                .eq(query.getId() != null, Item::getId, query.getId())
//                .eq(StrUtil.isNotBlank(query.getBrand()), Item::getBrand, query.getBrand())
//                .eq(StrUtil.isNotBlank(query.getCategory()), Item::getCategory, query.getCategory())
//                .ne(!AdminContext.isAdmin(), Item::getStatus, ItemStatus.DELETED.getValue())
//                .ge(query.getMinPrice() != null, Item::getPrice, query.getMinPrice())
//                .le(query.getMaxPrice() != null, Item::getPrice, query.getMaxPrice())
//                .page(query.toMpPage("update_time", false));
//    }

    @Override
    public PageDTO<ItemVO> search(ItemPageQuery query) {
        return esUtils.search(query);
    }

    @Override
    public void saveItem(ItemFormDTO itemFormDTO) {
        // id自增
        itemFormDTO.setId(null);
        Item item = BeanUtils.copyBean(itemFormDTO, Item.class);
        if (itemFormDTO.getIsAD() != null) {
            // 枚举转换
            item.setIsAD(ItemADFlag.of(itemFormDTO.getIsAD()));
        }
        // 默认上架
        item.setStatus(ItemStatus.NORMAL);
        // 默认销量为0
        item.setSold(0);
        LocalDateTime now = LocalDateTime.now();
        item.setCreateTime(now);
        item.setUpdateTime(now);
        save(item);
        // 同步es
        esUtils.save(ItemDoc.fromItem(item));
    }

    @Override
    public void updateItemStatus(Long id, ItemStatus itemStatus) {
        // 因为要同步es，所以不用updateById而是要先查出来
        Item item = getById(id);
        item.setStatus(itemStatus);
        updateById(item);
        // 同步es
        esUtils.save(ItemDoc.fromItem(item));
    }

    @Override
    public void updateItem(ItemFormDTO itemFormDTO) {
        // 因为要同步es，所以不用updateById而是要先查出来
        Item dbItem = getById(itemFormDTO.getId());
        BeanUtils.copyPropertiesIgnoreNull(itemFormDTO, dbItem);
        if (itemFormDTO.getIsAD() != null) {
            // 枚举转换
            dbItem.setIsAD(ItemADFlag.of(itemFormDTO.getIsAD()));
        }
        updateById(dbItem);
        // 同步es
        esUtils.save(ItemDoc.fromItem(dbItem));
    }
}
